home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / lib / python2.6 / dist-packages / checkbox / reactor.pyc (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2009-10-12  |  4.2 KB  |  112 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.6)
  3.  
  4. import re
  5. import logging
  6. from checkbox.lib.log import format_object
  7.  
  8. class EventID(object):
  9.     
  10.     def __init__(self, event_type, pair):
  11.         self._event_type = event_type
  12.         self._pair = pair
  13.  
  14.  
  15.  
  16. class StopException(Exception):
  17.     pass
  18.  
  19.  
  20. class StopAllException(Exception):
  21.     pass
  22.  
  23.  
  24. class Reactor(object):
  25.     
  26.     def __init__(self):
  27.         self._event_handlers = { }
  28.         self._event_stack = []
  29.  
  30.     
  31.     def call_on(self, event_type, handler, priority = 0):
  32.         pair = (handler, priority)
  33.         logging.debug('Calling %s on %s.', format_object(handler), event_type)
  34.         handlers = self._event_handlers.setdefault(event_type, [])
  35.         handlers.append(pair)
  36.         return EventID(event_type, pair)
  37.  
  38.     
  39.     def fire(self, event_type, *args, **kwargs):
  40.         logging.debug('Started firing %s.', event_type)
  41.         if event_type in self._event_stack:
  42.             raise StopAllException, 'Loop detected for event type: %s.' % event_type
  43.         event_type in self._event_stack
  44.         self._event_stack.append(event_type)
  45.         results = []
  46.         handlers = []
  47.         for key, value in self._event_handlers.items():
  48.             if re.match('^%s$' % key, event_type):
  49.                 handlers.extend(value)
  50.                 continue
  51.         
  52.         handlers = sorted(handlers, key = (lambda pair: pair[1]))
  53.         if not handlers:
  54.             logging.debug('No handlers found for event type: %s', event_type)
  55.         
  56.         for handler, priority in handlers:
  57.             
  58.             try:
  59.                 logging.debug('Calling %s for %s with priority %d.', format_object(handler), event_type, priority)
  60.                 results.append(handler(*args, **kwargs))
  61.             continue
  62.             except StopException:
  63.                 break
  64.                 continue
  65.                 except StopAllException:
  66.                     raise 
  67.                     continue
  68.                     except KeyboardInterrupt:
  69.                         logging.exception('Keyboard interrupt while running event handler %s for event type %r with args %r %r.', format_object(handler), event_type, args, kwargs)
  70.                         self.stop_all()
  71.                         continue
  72.                         logging.exception('Error running event handler %s for event type %r with args %r %r.', format_object(handler), event_type, args, kwargs)
  73.                         continue
  74.                     
  75.                 self._event_stack.pop(-1)
  76.                 logging.debug('Finished firing %s.', event_type)
  77.                 return results
  78.  
  79.  
  80.     
  81.     def cancel_call(self, id):
  82.         if type(id) is EventID:
  83.             self._event_handlers[id._event_type].remove(id._pair)
  84.         else:
  85.             raise Exception, 'EventID instance expected, received %r' % id
  86.         return type(id) is EventID
  87.  
  88.     
  89.     def cancel_all_calls(self, event_type):
  90.         del self._event_handlers[event_type]
  91.  
  92.     
  93.     def run(self):
  94.         
  95.         try:
  96.             self.fire('run')
  97.         except StopAllException:
  98.             e = None
  99.             logging.critical(e)
  100.  
  101.         self.fire('stop')
  102.  
  103.     
  104.     def stop(self):
  105.         raise StopException
  106.  
  107.     
  108.     def stop_all(self):
  109.         raise StopAllException
  110.  
  111.  
  112.